#include "stdio.h"
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char const *argv[])
{
    printf("main进程(%d)开始执行 \n", getpid());
    int val = 100;
    // 创建一个子进程
    /*
        fork调用会返回两次
        创建一个子进程， 拷贝父进程的内存空间作为子进程的内存空间
        依次选择父进程和子进程继续向下执行  (内部有一个程序计数器PC, 记录当前程序执行到的位置)
        选择父进程：返回子进程的pid
        选择子进程：返回0
    */
    pid_t pid = fork();
    if (pid > 0) { // 父进程
        val++; // 101
        printf("父进程(%d)继续执行， 子进程id=%d, val=%d val地址：%p\n", getpid(),
             pid, val, &val);
    } else if (pid == 0) { // 子进程
        val--; // 99
        printf("子进程(%d)开始执行， 父进程id=%d, val=%d val地址：%p\n", getpid(), 
            getppid(), val, &val);
    } else { // 创建子进程失败
        printf("创建子进程失败\n");
        return -1;
    }

    printf("进程(%d)执行即将结束 \n", getpid());

    return 0;
}
